package automaton.view;


import java.awt.*;
/**
 * Desenha o automato atual na ultima posicao possivel de acordo
 * com o estado atual do vetor de booleanos respeitando a regra de 
 * que cada automato deve ser representado por um quadrado na linha
 * que eh preenchido com cor preta se estiver ligado e nao preenchido
 * se estiver desligado. 
 * @author Grupo 6
 */
public class BooleanMatrixCanvas extends Canvas {


	/**
	 * Serial
	 */
	private static final long serialVersionUID = -2815618145323130667L;

	/**
	 * Constante que indica que tamanho nao foi definido
	 */
	public static final int UNDEFINED_CELL_SIZE = -1;
	
	/**
	 * Matriz que sera desenhada neste canvas
	 */
	private BooleanMatrix matriz;
	
	/**
	 * Tamanho de cada celula quadrada no desenho.
	 **/
	private int cellSize;
	
	/**
	 * Receives the matrix that will be printed and update the drawingMatrix attribute. 
	 * @param matriz the one that will be designed
	 */
	public BooleanMatrixCanvas(BooleanMatrix matriz) {
		super();
		this.setMatriz(matriz);
	}

	/**
	 * Paint this component 
	 */
	public void update(Graphics g) {	

		if(this.matriz == null) {
			System.out.print("Impossivel desenhar matriz de boolean: a matriz esta nula");
			return;
		}
		
	    // Lendo configuracoes graficas...
		Graphics offgc;
		Image offscreen = null;
		Rectangle box = g.getClipBounds();
		Dimension d = this.getSize();
		
		int lRowCount, 
			lColCount, 
			lMaxRows = this.getMatriz().getHeight(), 
			lMaxCols = this.getMatriz().getWidth(),
			lCellWidth = (this.getWidth()/lMaxCols), 
			lCellHeight = (this.getHeight()/lMaxRows);
		
		// Double buffering, second buffer
		offscreen = this.createImage(d.width , d.height);
		offgc = offscreen.getGraphics();
		
		// Painting component Background
		offgc.setColor(Color.WHITE);
		offgc.fillRect(0,0, this.getWidth(), this.getHeight());
		
		// Painting matrix
		for(lRowCount = 0;lRowCount < lMaxRows; lRowCount++) {
			for(lColCount=0;lColCount < lMaxCols; lColCount++) {
				if(this.getMatriz().getCell(lRowCount,lColCount)) {
					offgc.setColor(Color.BLACK);
				} else {
					offgc.setColor(Color.WHITE);
				}
				offgc.fillRect(lColCount * lCellWidth, lRowCount * lCellHeight, lCellWidth, lCellHeight);
			}
		}
	
		offgc.translate(-box.x, -box.y);
		
		// Repassa o desenho feito em buffer para a tela
		g.drawImage(offscreen, box.x,box.y, this);
		
		// Faz o redesenho normalmente
		this.paint(offgc);
     
	}
	
	public void setVisible(boolean b) {
		super.setVisible(b);
		this.createBufferStrategy(2);
	}

	public void setCellSize(int s) {
		this.cellSize = s;
	}

	public int getCellSize() {
		return this.cellSize;
	}

	public void setMatriz(BooleanMatrix matriz) {
		this.matriz = matriz;
	}

	public BooleanMatrix getMatriz() {
		return this.matriz;
	}

}
